home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / util / libs / graphics3d.lha / src / example / 3dlibdemo.e < prev    next >
Encoding:
Text File  |  1998-10-17  |  7.9 KB  |  395 lines

  1.  
  2. /*** Routin of test for graphics3d.library **/
  3. /** SEE 3dlib.h also **/
  4.  
  5. PROC main()
  6. DEF a3d:LONG
  7. DEF g:LONG
  8. DEF w:LONG
  9. DEF i:LONG
  10. DEF in:LONG
  11. DEF out:LONG
  12. DEF ob:LONG
  13. DEF np:LONG
  14. DEF d:LONG
  15. DEF s:LONG
  16. DEF cb:LONG
  17. DEF mode:LONG
  18. DEF c1:rgbtype
  19. DEF c2:rgbtype
  20. DEF vdist:LONG
  21. DEF gcolor:LONG
  22. DEF x0:LONG
  23. DEF y0:LONG
  24. DEF pjt:LONG
  25. DEF id:LONG
  26. DEF px:LONG
  27. DEF py:LONG
  28. DEF ay:LONG
  29. DEF ax:LONG
  30. DEF lx:LONG
  31. DEF ly:LONG
  32. DEF lz:LONG
  33. DEF il:LONG
  34. DEF vx:LONG
  35. DEF sx:LONG
  36. DEF ds:LONG
  37. DEF sl:LONG
  38. DEF fa:LONG
  39. DEF fd:LONG
  40. DEF fm:LONG
  41. DEF sid:LONG
  42. DEF dw:LONG
  43. DEF dh:LONG
  44. DEF esi:LONG
  45. DEF dts:datestamp
  46. DEF dts1:datestamp
  47. DEF time:LONG
  48. DEF scrr:PTR TO screenmoderequester
  49. DEF buf[100]:STRING
  50.  
  51.  
  52. WriteF('INIZIALIZZAZIONE ...\n')
  53. sid:=$8000
  54. dw:=640
  55. dh:=240
  56.  
  57. aslbase:=NIL
  58. IF ((aslbase:=OpenLibrary('asl.library',38))<=NIL) THEN JUMP no_asl
  59.  
  60. scrr:=AllocAslRequest(ASL_SCREENMODEREQUEST,
  61.     [ASLSM_MAXDEPTH,8,
  62.      ASLSM_MINDEPTH,5,
  63.      ASLSM_MINWIDTH,640,
  64.      NIL])
  65. IF scrr=NIL THEN JUMP abort_b1 
  66.  
  67. IF AslRequest(scrr,[NIL])=FALSE THEN JUMP abort_b1
  68.  
  69. dw:=scrr.displaywidth
  70. dh:=scrr.displayheight
  71. sid:=scrr.displayid
  72.  
  73. no_asl:
  74.  
  75. WriteF('mode_id:$\h  width:\d height:\d\n',sid,dw,dh)
  76.  
  77. /*s:=OpenS(dw,dh,5,sid,'TEST 3DLIBS VERS. IN E')*/
  78. s:=OpenScreenTagList(NIL,
  79.     [SA_TITLE,'TEST 3DLIBS VERS. IN E',
  80.      SA_DEPTH,5,
  81.      SA_TYPE,CUSTOMSCREEN,
  82.      SA_DISPLAYID,sid,
  83.      SA_WIDTH,dw,
  84.      SA_HEIGHT,dh,
  85.      NIL])
  86. IF s<=NIL THEN JUMP abort_b1 
  87.  
  88. g:=start_es(s)
  89. IF g<=NIL 
  90.     CloseScreen(s)
  91.     JUMP abort_b1
  92. ENDIF
  93.  
  94. w:=gad_w(g,20,20,550,200,'prova 3dlib',13)
  95.  
  96. WriteF('window=\d\n',w)
  97.  
  98. /** set mode cursor for object and initial light position **/
  99. fm:=0
  100. sl:=16
  101. il:=1*FIXV
  102. lx:=0
  103. ly:=0
  104. lz:=sl*9
  105. /********************************/
  106.  
  107. /** OPEN AND INITIALIZE A NEW 3D SPACE **/
  108. a3d:=display3d(w,0,0,350,150,300)
  109. IF a3d=NIL THEN JUMP abort_b
  110. /***************************************/
  111.  
  112. /** TEST FUNCTION INTEGER <-> FIXPOINT ***/
  113. i:=12
  114. WriteF('i2f=\d\n',Gd_int2fix({i},{out}))
  115. WriteF('f2i=\d\n',Gd_fix2int({out},{in}))
  116. WriteF('orig=\d int=\d fix=\d \n',i,in,out)
  117. /****************************************/
  118.  
  119. /** DEFINE TWO SFUMATE COLOURS, FOR FLAT SHADING **/ 
  120. c1.r:=0
  121. c1.g:=0
  122. c1.b:=0
  123. c2.r:=15
  124. c2.g:=8
  125. c2.b:=0
  126. Gd_touchpalette(a3d,16,30,c1,c2)
  127. WriteF('touch1\n')
  128. c1.r:=0
  129. c1.g:=0
  130. c1.b:=0
  131. c2.r:=0 
  132. c2.g:=8
  133. c2.b:=15
  134. Gd_touchpalette(a3d,1,15,c1,c2)
  135. WriteF('touch2\n')
  136. /**************************************************/
  137.  
  138. /** SET DEFAULT SOLID SHADING **/
  139. cb:=1
  140. mode:=SOLID
  141. /*******************************/
  142.  
  143. /** DEFINE A NEW ASPECT RATIO FOR A 640x256 SCREEN **/
  144. Gd_aspectratio(a3d,FIXV/2)
  145. WriteF('change aspect ratio\n')
  146. /****************************************************/
  147.  
  148. esi:=0
  149. /** CREATE AND POSITION OF #1 OBJECT *****/
  150. WriteF('Leggo #1 oggetto...\n')
  151. i:=plgloadobject(a3d,'pyramid.plg',1*FIXV)
  152. WriteF('result plgloadobject #1 :\d\n',i)
  153. IF i<>0 THEN Gd_positionobject(a3d,500*FIXV,0,560*FIXV)
  154. esi:=esi+i
  155.  
  156. /** CREATE AND POSITION OF 2# OBJECT *****/
  157. WriteF('Leggo #2 oggetto...\n')
  158. i:=plgloadobject(a3d,'sfera.plg',2*FIXV)
  159. WriteF('result plgloadobject #2 :\d\n',i)
  160. IF i<>0 THEN Gd_positionobject(a3d,200*FIXV,0,800*FIXV)
  161. esi:=esi+i
  162.  
  163. /** CREATE AND POSITION OF #3 OBJECT *****/
  164. WriteF('Leggo #3 oggetto...\n')
  165. i:=plgloadobject(a3d,'cube.plg',1*FIXV)
  166. WriteF('result plgloadobject #3 :\d\n',i)
  167. IF i<>0 THEN Gd_positionobject(a3d,0,0,0)
  168. esi:=esi+i
  169.  
  170. /** CREATE AND POSITION OF #4 OBJECT *****/
  171. WriteF('Leggo #4 oggetto...\n')
  172. plgloadobject(a3d,'pyramid.plg',2*FIXV)
  173. WriteF('result plgloadobject #4 :\d\n',i)
  174. IF i<>0 THEN i:=Gd_positionobject(a3d,400*FIXV,0,750*FIXV)
  175. /*****************************************/
  176. esi:=esi+i
  177. IF esi=0 THEN JUMP abort_b
  178.  
  179. Gd_frustum(a3d,-500,16000)           /* CHANGE SOME SETTINGS */
  180. Gd_clipmode(a3d,ZPLANE)             /* EITHER #FRUSTUM OR #ZPLANE */
  181. Gd_createlightsource(a3d,lx,ly,lz)  /* PLACE THE LIGHT SOURCES */
  182. Gd_ambientlight(a3d,il)             /* SET THE INITIAL LIGHT INTENSITY */ 
  183. Gd_positioncamera(a3d,0,0,-1000*FIXV)
  184.             /* CAMERA AT SOME HEIGHT OFF THE GROUND */
  185.  
  186. /** SET OFF ALL SCENE 3D PARAMETERS **/
  187. /** CHANGE COLOUR OF VISUALIZATION BOX **/
  188. gcolor:=9
  189. /** CHANGE OBSERVER DISTANCE **/
  190. vdist:=200
  191. /** CHANGE BOX ORIGIN **/
  192. x0:=10
  193. y0:=15
  194. /** CHANGE TYPE OF PROJECTION (experimental) **/
  195. pjt:=PARAL_P
  196.  
  197. WriteF('cp. esi=\d\n',Gd_cascene(a3d,[ CS_GCOLOR,gcolor,
  198.     CS_VDIST,vdist,
  199.     CS_NPX0,x0,
  200.     CS_NPY0,y0,
  201.     END_T,NIL]:tag3d))
  202. /*****************************************/
  203.  
  204. /** DISPLAY THE BORDERS OF VISUALIZATION BOX **/
  205. Box(x0-1,y0-1,350+x0+1,150+y0+1,1)
  206.  
  207. DateStamp(dts)
  208. /*** RECALC THE VIEWING ***/
  209. Gd_newview(a3d)
  210. /*** REDRAW THE VIEWING ***/
  211. Gd_paintframe(a3d)
  212. /*** VISUALIZING THE VIEWING ***/ 
  213. Gd_switch_rp(a3d)
  214. DateStamp(dts1)
  215.  
  216. mouse_ON(g)
  217.  
  218. IF fm=0 THEN StringF(buf,'objects')
  219. IF fm=1 THEN StringF(buf,'lights ')
  220. TextF(380,60,'c_mode :\s',buf)
  221. TextF(380,70,'x=\d y=\d z=\d ',lx,ly,lz)
  222. TextF(380,80,'light int.:\d ',il)
  223.  
  224. ay:=0
  225. ax:=90
  226. vx:=0
  227. sx:=FIXV
  228. ds:=Shr(FIXV,4)
  229. d:=0
  230. ob:=-1
  231. WHILE (pause(g)=NIL)
  232.  
  233.     time:=(TICKS_PER_SECOND*60*dts1.minute)-(TICKS_PER_SECOND*60*dts.minute)+
  234.          dts1.tick-dts.tick
  235.  
  236.     fa:=0
  237.     d:=0
  238.     i:=inkey(g)
  239.     SELECT i
  240.         /** switch object-light mode cursor **/
  241.         CASE "l"
  242.             fm:=fm+1
  243.             IF fm>1 THEN fm:=0
  244.             fa:=1
  245.         /** SWITCH ON-OFF POLIGONS BORDER ***/ 
  246.         CASE "b"
  247.             IF cb=1 THEN cb:=-1 ELSE cb:=1
  248.             Gd_changeviewmode(a3d,mode,cb)
  249.         /** SET WIRE FRAME SHADING ***/
  250.         CASE "w"
  251.             mode:=WIREF    
  252.             Gd_changeviewmode(a3d,mode,cb)
  253.         /** SET SOLID SHADING **/
  254.         CASE "s"
  255.             mode:=SOLID    
  256.             Gd_changeviewmode(a3d,mode,cb)
  257.         /** SET FLAT SHADING **/
  258.         CASE "f"
  259.             mode:=FLAT     
  260.             Gd_changeviewmode(a3d,mode,cb)
  261.         CASE CDE
  262.             IF fm=NIL
  263.                 ay:=ay+2
  264.             ELSE
  265.                 lx:=lx-sl
  266.             ENDIF
  267.             fa:=1
  268.         CASE CSI
  269.             IF fm=NIL
  270.                 ay:=ay-2
  271.             ELSE
  272.                 lx:=lx+sl
  273.             ENDIF
  274.             fa:=1
  275.         CASE CSU
  276.             IF fm=NIL
  277.                 ax:=ax+2
  278.             ELSE
  279.                 ly:=ly+sl
  280.             ENDIF
  281.             fa:=1
  282.         CASE CGIU
  283.             IF fm=NIL
  284.                 ax:=ax-2
  285.             ELSE
  286.                 ly:=ly-sl
  287.             ENDIF
  288.             fa:=1
  289.         CASE "i"
  290.             IF fm=NIL
  291.                 sx:=sx+ds
  292.             ELSE
  293.                 il:=il+(FIXV/2)
  294.                 IF il>(14*FIXV) THEN il:=14*FIXV
  295.             ENDIF
  296.             fa:=1
  297.         CASE "o"
  298.             IF fm=NIL
  299.                 sx:=sx-ds
  300.                 IF sx<=0 THEN sx:=sx+ds ELSE fa:=1
  301.             ELSE
  302.                 il:=il-(FIXV/2)
  303.                 IF il<0 THEN il:=0
  304.                 fa:=1
  305.             ENDIF
  306.         CASE "8"
  307.         /** MOVE THE VIEWER TO THE SCREEN ***/
  308.             IF fm=0    
  309.                 d:=40*FIXV
  310.                 Gd_moveforward(a3d,d)
  311.             ELSE
  312.                 lz:=lz+sl
  313.                 fa:=1
  314.             ENDIF
  315.         CASE "2"
  316.         /** MOVE THE VIEWER FROM THE SCREEN ***/
  317.             IF fm=0
  318.                 d:=-40*FIXV        
  319.                 Gd_moveforward(a3d,d)
  320.             ELSE
  321.                 lz:=lz-sl
  322.                 fa:=1
  323.             ENDIF
  324.         CASE "4"
  325.         /** CHANGE THE ANGLE OF VIEW TO LEFT **/
  326.             vx:=vx+1
  327.             Gd_viewangle(a3d,0,vx,0)
  328.         CASE "6"
  329.         /** CHANGE THE ANGLE OF VIEW TO RIGHT **/
  330.             vx:=vx-1
  331.             Gd_viewangle(a3d,0,vx,0)
  332.     ENDSELECT    
  333.  
  334.     np:=mouse(g)
  335.     IF np=1
  336.         px:=mouseX(g)
  337.         py:=mouseY(g)
  338.         TextF(380,20,'oggetto id#   ',ob)
  339.         TextF(380,30,'poligono n#   ',np)
  340.         TextF(380,40,'Ax=\d Ay=\d sx=\d  ',ax,ay,sx)
  341.         TextF(380,50,'X=\d y=\d ',px,py)
  342.     /** TEST IF AT POINT(px,py) IS PRESENT A POLIGON AND AN OBJECT **/ 
  343.         ob:=Gd_pickobj(a3d,{np},px,py)
  344.         IF ob>NIL
  345.             TextF(380,20,'oggetto id#\d ',ob)
  346.             TextF(380,30,'poligono n#\d ',np)
  347.         ENDIF                    
  348.     ENDIF
  349.         
  350.     IF fa 
  351.         IF fm=0 THEN StringF(buf,'objects')
  352.         IF fm=1 THEN StringF(buf,'lights ')
  353.         TextF(380,60,'c_mode :\s',buf)
  354.         IF (fm=0) AND (ob>0)
  355.     /** SET THE TRASFORMATION TO THE EVENTUALLY PICKED OBJECT **/
  356.             TextF(380,40,'Ax=\d Ay=\d sx=\d  ',ax,ay,sx)
  357.             Gd_setobj(a3d,ob)
  358.             Gd_rotateobject(a3d,ax,0,ay)
  359.             Gd_scaleobject(a3d,sx,sx,sx)
  360.         ENDIF
  361.         IF fm 
  362.     /** CHANGE LIGHT POSITION **/
  363.             TextF(380,70,'x=\d y=\d z=\d ',lx,ly,lz)
  364.             Gd_createlightsource(a3d,lx,ly,lz)
  365.     /** CHANGE LIGHT INTENSITY **/
  366.             TextF(380,80,'light int.:\d ',il)
  367.             Gd_ambientlight(a3d,il)
  368.         ENDIF
  369.     ENDIF    
  370.     IF i>=NIL 
  371.         DateStamp(dts)
  372.     /*** RECALC THE VIEWING ***/
  373.         Gd_newview(a3d)
  374.     /*** REDRAW THE VIEWING ***/
  375. /*** funzione maggiormente bisognosa di ottimizzazione ***/
  376.         Gd_paintframe(a3d)
  377.     /*** VISUALIZING THE VIEWING ***/ 
  378.         Gd_switch_rp(a3d)
  379.         DateStamp(dts1)
  380.     ENDIF
  381.     TextF(380,90,'ticks:\d  ',time)
  382. ENDWHILE
  383.  
  384. WriteF('termino.. \n')
  385. /** CLOSE AND DESTROY ALL DEFINITION CREATE BY display3d **/
  386. abort_b:
  387. close_display3d(a3d)
  388. gad_cw(g)
  389. end(g,1)
  390. CloseScreen(s)
  391. abort_b1:
  392. IF aslbase<>NIL THEN CloseLibrary(aslbase)
  393.  
  394. ENDPROC    
  395.